package com.zeyun.EasyOnlineShareCloud.common.enums;

import com.zeyun.EasyOnlineShareCloud.common.convention.errorcode.IErrorCode;

/**
 * 标准化错误码（4位编码体系）
 * 编码规则：
 * [A] 客户端错误（用户端问题）
 * [B] 系统错误（服务端问题）
 * [C] 第三方错误（外部依赖问题）
 * 结构示例：
 * A000 - 一级宏观错误码（客户端错误）
 * A100 - 二级宏观错误码（用户注册错误）
 * A101 - 三级具体错误码（用户名重复）
 */
public enum ResultErrorCodeEnums implements IErrorCode {

	/* ------------------------ 成功码 ------------------------ */
	SUCCESS("0000", "操作成功"),

	/* ======================= 客户端错误 ======================= */
	// ----- 通用客户端错误 -----
	CLIENT_ERROR("A000", "客户端错误"),
	PARAM_VALIDATION_FAILED("A001", "参数校验失败"),
	REQUEST_FREQUENCY_LIMIT("A002", "请求频率过高"),

	// ----- 用户认证 (A1xx) -----
	USER_AUTH_ERROR("A100", "用户认证错误"),
	USER_TOKEN_INVALID("A101", "用户Token无效"),
	USER_TOKEN_EXPIRED("A102", "用户Token已过期"),
	USER_CREDENTIAL_ERROR("A103", "用户名或密码错误"),
	USER_NOT_LOGIN("A104", "用户未登录"),
	USER_ALREADY_LOGIN("A105", "用户已登录"),

	// ----- 用户注册 (A2xx) -----
	USER_REGISTER_ERROR("A200", "用户注册错误"),
	USERNAME_EXIST("A201", "用户名已存在"),
	USERNAME_ILLEGAL("A202", "用户名包含非法字符"),
	USERNAME_SENSITIVE("A203", "用户名包含敏感词"),
	PASSWORD_WEAK("A204", "密码强度不足"),
	PHONE_FORMAT_ERROR("A205", "联系方式格式错误"),
	EMAIL_FORMAT_ERROR("A206", "邮箱格式错误"),
	ID_CARD_FORMAT_ERROR("A207", "身份证格式错误"),

	// ----- 权限相关 (A3xx) -----
	PERMISSION_DENIED("A300", "权限不足"),
	ROLE_NOT_ASSIGNED("A301", "未分配有效角色"),

	// ----- 请求相关 (A4xx) -----
	REQUEST_PARAM_ERROR("A400", "请求参数错误"),
	REQUEST_METHOD_ERROR("A401", "请求方法错误"),
	REQUEST_URL_ERROR("A402", "请求地址错误"),
	REQUEST_HEADER_ERROR("A403", "请求头错误"),
	REQUEST_BODY_ERROR("A404", "请求体错误"),
	REQUEST_PARAM_MISSING("A405", "请求参数缺失"),
	REQUEST_PARAM_TYPE_ERROR("A406", "请求参数类型错误"),
	REQUEST_PARAM_FORMAT_ERROR("A407", "请求参数格式错误"),
	REQUEST_PARAM_VALIDATION_FAILED("A408", "请求参数校验失败"),
	REQUEST_PARAM_EMPTY("A409", "请求参数为空"),
	REQUEST_PARAM_EMPTY_OR_NULL("A410", "请求参数为空或null"),

	/* ======================= 服务端错误 ======================= */
	// ----- 通用服务错误 -----
	SERVER_ERROR("B000", "服务端错误"),
	DB_OPERATION_FAILED("B001", "数据库操作失败"),
	IDEMPOTENT_TOKEN_ERROR("B002", "幂等Token异常"),
	CONCURRENCY_CONFLICT("B003", "数据版本冲突"),

	// ----- 业务逻辑错误 (B1xx) -----
	BUSINESS_ERROR("B100", "业务逻辑错误"),
	USER_NOT_FOUND("B101", "用户不存在"),
	DATA_NOT_FOUND("B102", "数据不存在"),
	DATA_EXISTED("B103", "数据已存在"),
	DATA_STATUS_ERROR("B104", "数据状态异常"),

	// ----- 系统资源错误 (B2xx) -----
	SYSTEM_RESOURCE_ERROR("B200", "系统资源异常"),
	API_LIMIT_EXCEEDED("B201", "API调用超限"),
	FILE_UPLOAD_FAILED("B202", "文件上传失败"),
	FILE_DOWNLOAD_FAILED("B203", "文件下载失败"),

	// ----- 数据库资源错误 (B3xx) -----
	DATABASE_RESOURCE_ERROR("B300", "数据库资源异常"),
	DATABASE_CONNECTION_ERROR("B301", "数据库连接异常"),
	DATABASE_QUERY_ERROR("B302", "数据库查询异常"),
	DATABASE_UPDATE_ERROR("B303", "数据库更新异常"),
	DATABASE_DELETE_ERROR("B304", "数据库删除异常"),
	DATABASE_INSERT_ERROR("B305", "数据库插入异常"),
	DATABASE_TRANSACTION_ERROR("B306", "数据库事务异常"),

	/* ======================= 第三方错误 ======================= */
	THIRD_PARTY_ERROR("C000", "第三方服务异常"),
	PAYMENT_SERVICE_ERROR("C001", "支付服务异常"),
	SMS_SERVICE_ERROR("C002", "短信服务异常"),
	OSS_SERVICE_ERROR("C003", "存储服务异常");

	private final String code;
	private final String message;

	ResultErrorCodeEnums(String code, String message) {
		this.code = code;
		this.message = message;
	}

	@Override
	public String code() {
		return code;
	}

	@Override
	public String message() {
		return message;
	}
}